/*
 * Copyright (C) 2010 EPRO
 */
package com.epro.dx.enable;

import java.util.concurrent.atomic.AtomicBoolean;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

import com.weipu.common.constants.Constant;

/**
 * 底部带有动画加载的列表适配器
 * 协助另一适配器出现加载动画的适配器。
 * 例如，这可能是用于一个适配器调用一个数据集合，其中每个调用返回一页的数据来填充。
 * @author cw55072
 * @version  [1.0, 2010-10-18]
 * @param <T>
 */
abstract public class EndlessAdapter<T> extends AdapterWrapper<T>
{
    /**
     * 获取底部加载效果布局
     * @param parent 
     * @return
     */
    abstract protected View getPendingView(ViewGroup parent);
    
    /**
     * 获取无加载效果底部布局（如果第一页列表数据条数少于每页要加载的条数调用）
     * @param parent 
     * @return
     */
    abstract protected View getNoPendingView(ViewGroup parent);
    
    /**
     * 加载数据,这个是在后台完成(返回false无数据加载，返回true继续加载数据)
     */
    abstract protected void cacheInBackground();
    
    /**
     * 继续添加数据，把加载完的数据填充到列表中
     */
    abstract protected void appendCachedData();
    
    /**
     * 获取列表数据行视图
     * @return
     */
    abstract protected View getListItemView(int position, View convertView, View pendingView);
    
    public View pendingView = null;
    
    private View pendingView1 = null;
    
    public AtomicBoolean keepOnAppending = new AtomicBoolean(true);
    
    public AtomicBoolean getKeepOnAppending()
    {
        return keepOnAppending;
    }
    
    public void setKeepOnAppending(AtomicBoolean keepOnAppending)
    {
        this.keepOnAppending = keepOnAppending;
    }
    
    public EndlessAdapter(Context context, int textViewResourceId, ArrayAdapter<T> wrapped)
    {
        super(context, textViewResourceId, wrapped);
    }
    
    @Override
    public int getCount()
    {
        if (keepOnAppending.get())
        {
            // 加载动画行
            return (super.getCount() + 1);
        }
        return (super.getCount());
        
    }
    
    /**
     * 获取每行的视图（包括加载动画和显示数据行）
     * @param position 
     * @param convertView 
     * @param parent 
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (position == super.getCount() && keepOnAppending.get())
        {
            if (pendingView == null)
            {
                pendingView = getPendingView(parent);
                if (super.getCount() < Constant.LIST_PAGE_COUNT)
                {
                    pendingView = getNoPendingView(parent);
                }
                else
                {
                    cacheInBackground();
                }
                pendingView1 = pendingView;
            }
            return pendingView;
        }
        else
        {
            return getListItemView(position, convertView, pendingView1);
        }
    }
}